package com.learning.spring.aop.advisor.advisor.staticmethod;

import com.learning.spring.aop.advisor.service.AopService;
import org.springframework.aop.ClassFilter;
import org.springframework.aop.support.StaticMethodMatcherPointcutAdvisor;

import java.lang.reflect.Method;
import java.util.Objects;

/**
 * ClassName: AopStaticMethodNameAdvisor
 * Description: 静态普通方法名匹配切面 - StaticMethodMatcherPointcutAdvisor
 * <p>
 * 1. 通过 StaticMethodMatcherPointcutAdvisor 定义的切面，在AopService#add()前织入 Advice增强。
 * 1.1 通过 StaticMethodMatcherPointcut 定义切点
 * 1.2 通过类过滤、方法名来匹配所定义的切点
 * <p>
 * 2.1 默认匹配所有的类，可以覆盖 getClassFilter 方法重写，定制指定匹配的被代理类
 * 2.2 在 matches() 方法中，可以自定义匹配规则匹配具体的方法，如模糊匹配、正则等
 * <p>
 * 3. 只能通过方法名定义切点，如需要匹配多个方法，则不够灵活。更推荐正则 RegexpMethodPointcutAdvisor 切面
 * <p>
 * Date: 2019/4/21 15:40 【需求编号】
 *
 * @author Sam Sho
 * @version V1.0.0
 */
public class AopStaticMethodNameAdvisor extends StaticMethodMatcherPointcutAdvisor {

    private static final String METHOD_NAME = "add";

    @Override
    public boolean matches(Method method, Class<?> targetClass) {
        // 切点方法匹配规则，方法名称为"add"。这边也可以做一些模糊匹配。
        return Objects.equals(METHOD_NAME, method.getName());
    }

    /**
     * 默认情况是匹配所有的类，重写定制指定匹配的被代理类
     *
     * @return
     */
    @Override
    public ClassFilter getClassFilter() {
        // 切点类匹配规则，为 AopService 的类或者子类
        return AopService.class::isAssignableFrom;
    }
}